#ifndef SMOOTHER_HPP
#define SMOOTHER_HPP

////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <vector>

namespace smeg {
    namespace tools {
        
////////////////////////////////////////////////////////////
/// Smooth a certain amount of variable
////////////////////////////////////////////////////////////
template <class T>
class Smoother {
    Smoother() {}

public:
    ////////////////////////////////////////////////////////////
    /// Constructor
    ////////////////////////////////////////////////////////////
    Smoother( int _iUpdateSize, const T& _ZeroValue ) : 
        m_History( _iUpdateSize, _ZeroValue ),
        m_uNextUpdate( 0 ),
        m_ZeroValue( _ZeroValue )
    {
    }
    
    ////////////////////////////////////////////////////////////
    /// Update the smoother
    ////////////////////////////////////////////////////////////
    T Update( const T& _NewValue ) {
        m_History[m_uNextUpdate++] = _NewValue;

        if ( m_uNextUpdate >= m_History.size() ) {
            m_uNextUpdate = 0;
        }

        T Sum = m_ZeroValue;

        for ( unsigned i = 0; i < m_History.size(); ++i ) {
            Sum += m_History[i];
        }

        return Sum / (float)m_History.size();
    }

private:
    /******************** Private members *********************/
    std::vector< T >        m_History;
    unsigned                m_uNextUpdate;

    const T                 m_ZeroValue;
};

    } // namespace tools
} // namespace smeg
#endif // SMOOTHER_HPP